gcc和g++是什么关系? |
您所在的位置:网站首页 › gcc c › gcc和g++是什么关系? |
我写过一篇这个文章, 介绍了 GCC 的整体架构 GCC 是 GNU 编译器集合的意思, 对于用户能用的常用命令, 有 gcc 和 g++. 无论是 gcc 还是 g++, 他们的定位都是 driver. driver 负责调用编译器(狭义), 把源码编译到汇编代码. 比如 C 语言的编译器(狭义)是 cc1, 而 C++ 语言的编译器(狭义)是 cc1plus. driver 再调用 as, 把汇编代码变成二进制代码. 最后调用 ld, 负责把二进制代码拼在一起. gcc 和 g++ 的区别无非就是调用的编译器不同, 并且传递给链接器的参数不同. 具体而言 g++ 会把 .c 文件当做是 C++ 语言 (在 .c 文件前后分别加上 -xc++ 和 -xnone, 强行变成 C++), 从而调用 cc1plus 进行编译. g++ 遇到 .cpp 文件也会当做是 C++, 调用 cc1plus 进行编译. g++ 还会默认告诉链接器, 让它链接上 C++ 标准库. gcc 会把 .c 文件当做是 C 语言. 从而调用 cc1 进行编译. gcc 遇到 .cpp 文件, 会处理成 C++ 语言. 调用 cc1plus 进行编译. gcc 默认不会链接上 C++ 标准库. 这些区别都可以在 @d41d8c 回答中的那两个源代码中看到. driver 一般会根据文件后缀名确定它是什么语言. 下面这段 GCC 的源代码中, 就储存了文件后缀名和处理流程的默认对应关系. 比如你可以用 gcc 或者 g++ 编译一个 .d 后缀名的文件 (D 语言), 那么他就会试图调用 d21 (D 语言相应的编译器) 在我电脑上不存在 D 语言的编译器, 所以就会失败. 或者也可以用 gfortran 编译一个 .c 文件. (会调用 cc1) 去年刚接触 C++ 的时候, 我也一直很困惑这些内容. 网上各种乱七八糟的解释都有. 现在的我终于有能力看 GCC 的源代码了, 还是感觉源代码最真实了, 不会骗我, 怎么写就是怎么样. 最常见的误导性言论是说 gcc 会调用 g++ 或者说 g++ 会调用 gcc. 可是 gcc 和 g++ 都是 driver 啊! 实际上 gcc 遇到 .cpp 调用的是 cc1plus, 就像 gcc 遇到 .d 文件会调用 d21 而不是 gdc (也是 driver), 遇到 .f 文件会调用 f951 而不是 gfortran (也是 driver) 一样. 为啥没人问 gcc/gfortran 有什么不同呢? 哈哈哈 更多有关 GCC 的故事可以看我那篇文章 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |